/**
 * Servlet Login: destinado a la gestion de todo lo relacionado con el proceso
 * de autenticacion de usuarios (medicos y pacientes)
 */

package infb.servlet.movil;

// Importaciones externas
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.naming.*;

// Importaciones internas
import infb.modelo.*;
import infb.dao.*;


public class Login extends HttpServlet {

    PacientesInterfaz pacienteDAO=null;
    MedicosInterfaz medicoDAO=null;

    /**
     * Metodo para inicializar la capa DAO utilizada en el servlet: muy importante a la hora
     * de optimizar los recursos de nuestra aplicacion
     * @param config
     * @throws javax.servlet.ServletException
     */
    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        // Inicializacion de objetos de la capa DAO
        try{
            Context contexto=new InitialContext();
            pacienteDAO=(PacientesInterfaz)contexto.lookup("PacientesEJB");
            medicoDAO=(MedicosInterfaz)contexto.lookup("MedicosEJB");
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    /**
     * Procesa la peticion del cliente (dispositivo movil) para atender peticiones de login/logout
     * @param peticion El objeto que encapsula la peticion del cliente
     * @param response El objeto que encapsula la respuesta del servidor a la peticion en cuestion
     * @throws ServletException Si ocurre un error especifico de servlet
     * @throws IOException Si ocurre un error de entrada/salida
     */
    protected void procesarPeticion(HttpServletRequest peticion,HttpServletResponse respuesta)
    throws ServletException,IOException {
        // Inicializacion de los flujos
        DataInputStream entradaDesdeCliente=new DataInputStream(peticion.getInputStream());
        DataOutputStream salidaHaciaCliente=new DataOutputStream(respuesta.getOutputStream());
        // Procesamos el mensaje enviado por el cliente: la accion (login o logout), el perfil: necesario
        // para saber sobre que tabla autenticarnos, la identificacion: que sera o bien la tarjeta sanitaria en caso
        // de un paciente o bien el numero de colegiado en caso del medico, y por ultimo el password
        String accion=entradaDesdeCliente.readUTF();
        String perfil=entradaDesdeCliente.readUTF();

        // Procesamos en funcion de la accion recibida
        // PROCESAMIENTO DE LOGIN
        
        if(accion.equalsIgnoreCase("login")){
            String identificacion=entradaDesdeCliente.readUTF();
            String password=entradaDesdeCliente.readUTF();
            if(perfil.equalsIgnoreCase("paciente")){
                // Ejecutamos nuestro metodo buscar asociado al ejb
                Pacientes paciente=pacienteDAO.estaAutenticado(identificacion,password);
                if(paciente!=null){
                    // Si encontramos al paciente, creamos su sesion y notificamos
                    // exito al cliente movil
                    HttpSession sesion=peticion.getSession();
                    // Fijamos un atributo de sesion: el identificador del paciente
                    sesion.setAttribute("identificacion",paciente.getId());
                    sesion.setAttribute("perfil","paciente");
                    salidaHaciaCliente.writeUTF(sesion.getId());
                }else{
                    // La autenticacion ha sido erronea
                    salidaHaciaCliente.writeUTF(CodigosMensajes.OPERACION_ERRONEA);
                }
            }else if(perfil.equalsIgnoreCase("medico")){
                Medicos medico=medicoDAO.estaAutenticado(identificacion,password);

                if(medico!=null){
                    // Si encontramos al medico, creamos su sesion y notificamos
                    // exito al cliente movil
                    HttpSession sesion=peticion.getSession();
                    // Fijamos un atributo de sesion: el identificador del paciente
                    sesion.setAttribute("identificacion",medico.getNumColegiado());
                    sesion.setAttribute("perfil","medico");
                    salidaHaciaCliente.writeUTF(sesion.getId());
                }else{
                    // La autenticacion ha sido erronea
                    salidaHaciaCliente.writeUTF(CodigosMensajes.OPERACION_ERRONEA);
                }
            }// PROCESAMIENTO DE ACTUALIZACION DE PARAMETROS DE IDENTIFICACION
        }else if(accion.equalsIgnoreCase("actualizar_identificacion")){
            String dni=entradaDesdeCliente.readUTF();
            Pacientes paciente=pacienteDAO.buscarPorDNI(dni);
            if(paciente!=null){
                // El paciente existia en la base de datos
                salidaHaciaCliente.writeUTF(CodigosMensajes.OPERACION_OK);
                salidaHaciaCliente.writeUTF(dni);
                salidaHaciaCliente.writeUTF(paciente.getTarjetaSanitaria());
                salidaHaciaCliente.writeUTF(paciente.getPassword());
            }else{
                // El dni introducido para solicitar la actualizacion, no se corresponde
                // con ningun paciente registrado en la base de datos
                salidaHaciaCliente.writeUTF(CodigosMensajes.OPERACION_ERRONEA);
            } // PROCESAMIENTO DEL LOGOUT
        }else if(accion.equalsIgnoreCase("logout")){

        }else if(accion.equalsIgnoreCase("cargar")){
            
                    HttpSession sesion=peticion.getSession();
                    // Fijamos un atributo de sesion: el identificador del paciente
                    sesion.setAttribute("identificacion",entradaDesdeCliente.readUTF());
                    sesion.setAttribute("perfil","medico");
                    salidaHaciaCliente.writeUTF(sesion.getId());
                    System.out.println("El perfil es:"+sesion.getAttribute("perfil"));
        }
        // Enviamos la salida al cliente
        salidaHaciaCliente.flush();
        // Cerramos los flujos
        entradaDesdeCliente.close();
        salidaHaciaCliente.close();
    }

    /**
     * Procesamiento de peticiones cliente GET
     * @param peticion El objeto que encapsula la peticion del cliente
     * @param response El objeto que encapsula la respuesta del servidor a la peticion en cuestion
     * @throws ServletException Si ocurre un error especifico de servlet
     * @throws IOException Si ocurre un error de entrada/salida
     */
    @Override
    protected void doGet(HttpServletRequest peticion,HttpServletResponse respuesta)
    throws ServletException,IOException {
        procesarPeticion(peticion,respuesta);
    }

    /**
     * Procesamiento de peticiones cliente POST
     * @param peticion El objeto que encapsula la peticion del cliente
     * @param response El objeto que encapsula la respuesta del servidor a la peticion en cuestion
     * @throws ServletException Si ocurre un error especifico de servlet
     * @throws IOException Si ocurre un error de entrada/salida
     */
    @Override
    protected void doPost(HttpServletRequest peticion,HttpServletResponse respuesta)
    throws ServletException,IOException {
        procesarPeticion(peticion,respuesta);
    }

    /**
     * Devuelve una descripcion de la funcionalidad del servlet
     * @return un String con la descripcion del servlet
     */
    @Override
    public String getServletInfo() {
        return "Servlet destinado al procesamiento de las peticiones de login/logout del cliente movil";
    }

}
